package dao.entities.control;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import javax.validation.constraints.Future;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.Columns;
import org.hibernate.envers.Audited;
import org.hibernate.validator.constraints.NotEmpty;

import utils.SessionUtils;
import views.annotations.Buscar;
import views.annotations.View;
import dao.interfaces.IBase;

@Entity
@Audited
@Table(schema = "GENERAL", name = "APUNTE")
@View.Views({ 
		@View(name = "table", fields = "id,description,centro,empresa,fecha_apunte,importe,tipo,procedencia"),
		@View(name = "record", fields = ""),
		@View(name = "selector", fields = "id,description") })
@Buscar(fields = "centro.description,empresa.description,tipo,procedencia,user,description")
public class Apunte implements IBase {

	@NotEmpty
	private String description;
	@Columns(columns = { @Column(name = "centro"), @Column(name = "empresa"),@Column(name="fecha") })
	@EmbeddedId
	private ApunteID id;
	@NotNull
	@ManyToOne
	@JoinColumn(name = "centro",updatable = false, insertable = false)
	private Centro centro;
	@NotNull
	@ManyToOne
	@JoinColumn(name = "empresa", updatable = false, insertable = false)
	private Empresa empresa;
	@Future
	@NotNull
	@Column(name = "fecha_apunte", updatable = false, insertable = false)
	private java.sql.Date fecha_apunte;
	@Min(value=1,message="no puede ser 0")
	@NotNull
	private float importe;
	
	@NotNull
	@Enumerated(EnumType.STRING)
	private Tipo tipo;
	@NotNull
	@Enumerated(EnumType.STRING)
	private Procedencia procedencia;
	private String notes;
	private String user;
	private Date date;

	@PreUpdate
	@PrePersist
	private void updateSave() {
		date = new Date();
		user = (String) SessionUtils.getSessionAttribute("user");
		
		ApunteID apunteID = new ApunteID((long) centro.getId(),
				(long) empresa.getId(), fecha_apunte);
		setId(apunteID);
	}
	
	public enum Tipo {
		ingreso, gasto
	}
	public enum Procedencia {
		banco,caja
	}

	@Override
	public Object getId() {
		return id;
	}

	@Override
	public void setId(Object id) {
		this.id = (ApunteID) id;
	};

	@Override
	public String getDescription() {
		return description;
	};

	@Override
	public void setDescription(String description) {
		this.description = description;
	}

	@Override
	public String getNotes() {
		return notes;
	};

	@Override
	public void setNotes(String notes) {
		this.notes = notes;
	}

	@Override
	public String getUser() {
		return user;
	};

	@Override
	public void setUser(String user) {
		this.user = user;
	}

	@Override
	public Date getDate() {
		return date;
	}

	@Override
	public void setDate(Date date) {
		this.date = date;
	}

	public Apunte() {
		super();
	}

	public Apunte(String description, String notes, String user, Date date) {
		super();
		this.description = description;
		this.notes = notes;
		this.user = user;
		this.date = date;
	}

	@Override
	public String toString() {
		return description;
	}

	public Centro getCentro() {
		return centro;
	}

	public void setCentro(Centro centro) {
		this.centro = centro;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public float getImporte() {
		return importe;
	}

	public void setImporte(float importe) {
		this.importe = importe;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public Procedencia getProcedencia() {
		return procedencia;
	}

	public void setProcedencia(Procedencia procedencia) {
		this.procedencia = procedencia;
	}

	public void setId(ApunteID id) {
		this.id = id;
	}

	public java.sql.Date getFecha_apunte() {
		return fecha_apunte;
	}

	public void setFecha_apunte(java.sql.Date fecha_apunte) {
		this.fecha_apunte = fecha_apunte;
	}


}
